/**
 * FWK ������
 */
//Object�̳� arguments[0]��)չ����arguments[1][n]�Ķ��� arguments[0]��arguments[1]����Object����
FWK.extend = function(){
	if(arguments[2] && (FWK.isStr(arguments[2]) || FWK.isArr(arguments[2]))){
		var methods = FWK.isStr(arguments[2])?[arguments[2]]:arguments[2];
		for(var i=0;i<methods.length;i+=1){
			if(arguments[1][methods[i]]){
				arguments[0][methods[i]] = arguments[1][methods[i]];
			}
		}
		methods = null;delete methods;
	}
	else{
		for(var n in arguments[1]){
			arguments[0][n] = arguments[1][n];
		}
	}
	return arguments[0];
}
//�Ա���)չ
FWK.extra = function(ex){
	for(var n in ex){
		this[n] = ex[n];
	}
	return this;
}
/**
 * ��̳�
 * @param {Object} subFn	����
 * @param {Object} superFn ����
 */
/*
 * @usage
 * 			var ModArticle = function(title) {
 * 				{
 * 					Module.apply(this, arguments); //����
 * 				}
 * 			}
 * 			FWK.Extend(ModArticle, Module);
 */
FWK.Extend = function(subFn, superFn){
    subFn.prototype = new superFn();
    subFn.prototype.constructor = subFn;
}

/**
 * ���¿��Խ�����function��Ļ��࣬��������function�඼�����������̳ж�4
 * �磺var FWK.PageUI = FWK.Class.extend({});	FWK.PageUI��FWK.Class�ϼ̳ж�4		FWK.PageUIӵ��FWK.Class���еķ���������
 * �磺var FWK.PageUIx = FWK.PageUI.extend({});	FWK.PageUIx��FWK.PageUI�ϼ̳ж�4 	FWK.PageUIxӵ��FWK.PageUI���еķ���������
 * ��new ��ʱ�򣬻����$init���� �磺var xx = new FWK.PageUI(a,b); �����FWK.PageUI�е�$init����������a,b������init����
 */
FWK.Class = function() {};
FWK.Class.prototype = {
	$init : function() {},
	extra:FWK.extra
};
FWK.Class.extend = function(_def) {
    var classDef = function() {
        if (arguments[0] !== FWK.Class) {
			this.$init.apply(this, arguments);
		}
    }
    var proto = new this(FWK.Class);
    var superClass = this.prototype;

    for(var n in _def){
        var item = _def[n];
		//���� �˷����� ������ �˷����� superset ����ָ�򸸷����� ִ��
        if (item instanceof Function && superClass[n])item.superset = superClass[n];
        proto[n] = item;
    }
    classDef.prototype = proto;
    //��������µ�����ͬ��ľ�̬extend����
    classDef.extend = this.extend;
    return classDef;
}

FWK.extend(FWK,{
	//����Ƿ�ΪIE����
	isIE:window.attachEvent && !window.opera,
	//����Ƿ�ΪIE6
	isIE6:window.navigator.appName=="Microsoft Internet Explorer" && parseInt(window.navigator.appVersion.substr(window.navigator.appVersion.indexOf("MSIE")+5))>5.5 && parseInt(window.navigator.appVersion.substr(window.navigator.appVersion.indexOf("MSIE")+5))<7,
	isKhtml:navigator.userAgent.indexOf("KHTML") > -1 || navigator.userAgent.indexOf("Konqueror") > -1 || navigator.userAgent.indexOf("AppleWebKit") > -1,
	/**
	 * ����Ƿ�ΪDom�ڵ�
	 * @param {All} _obj
	 * @return true | false
	 */
	isEl : function(_obj) {
		return _obj && _obj.nodeType == 1;
	},
	isTl : function(_obj){
		return _obj && _obj.nodeType == 3;
	},
	isET : function(_obj){
		return FWK.isEl(_obj) || FWK.isTl(_obj);
	},
	/**
	 * ����Ƿ�Ϊ�������
	 * @param {All} _obj
	 * @return true | false
	 */
	isArr: function(_obj) {
		return _obj && _obj.constructor === Array;
	},
	/**
	 * ����Ƿ�ΪObject���󣬲��Ҳ��������Dom����
	 * @param {All} _obj
	 * @return true | false
	 */
	isObj: function(_obj) {
		return _obj instanceof Object && !FWK.isArr(_obj) && !FWK.isEl(_obj);
	},
	/**
	 * ����Ƿ�Ϊ����
	 * @param {All} _obj
	 * @return true | false
	 */
	isFun: function(_obj) {
		return typeof _obj == "function";
	},
	/**
	 * ����Ƿ�Ϊ�ַ�
	 * @param {All} _obj
	 * @return true | false
	 */
	isStr: function(_obj) {
		return typeof _obj == "string";
	},
	/**
	 * ����Ƿ�Ϊ����
	 * @param {All} _obj
	 * @return true | false
	 */
	isNum: function(_obj) {
		return typeof _obj == "number";
	},
	/**
	 * ����Ƿ�Ϊundefined����
	 * @param {All} _obj
	 * @return true | false
	 */
	isDate: function(){
		return _obj instanceof Date;
	},
	/**
	 * ֱ�ӽ����XML�淶���ַ�ת��XML����
	 * @param {String} xmlString
	 * @return XML : null
	 */
	loadXML : function(xmlString){
		try {
			XMLDoc = new ActiveXObject("Microsoft.XMLDOM");
		} catch(e) {
			try {
				XMLDoc = document.implementation.createDocument("text/xml", "", null); //new XMLDocument();
			}catch(e){
				return null;
			}
		}
		if(FWK.isIE){
			var flag = XMLDoc.loadXML(xmlString);
			if(flag){
				return XMLDoc;
			}
			else{
				return null;
			}
		}
		else{
			try
			{
				var childNodes = XMLDoc.childNodes;
				for (var i = childNodes.length - 1; i >= 0; i--)
					XMLDoc.removeChild(childNodes[i]);

				var dp = new DOMParser();
				var newDOM = dp.parseFromString(xmlString, "text/xml");
				var newElt = XMLDoc.importNode(newDOM.documentElement, true);
				XMLDoc.appendChild(newElt);
				return XMLDoc;
			}
			catch (ex)
			{
				return null;
			}
		}

	},
	getDomain:function(main){
		main = main || "com";
		var sRE = "([^.]+\\." + main + ")";
        var oRE = new RegExp(sRE);
        if(oRE.test(document.domain)) {
            return RegExp["$1"];
        } else {
            return document.domain;
        }
	}
});

/*
 * ��Function.prototype���ԭ��t
 */
FWK.extend(Function.prototype,{
	/**
	 * ʹ�� this ָ��ķ����е�thisָ��_obj����
	 * @param {Object} _obj		����thisָ��
	 * @param {Array} _args		�������
	 */
	bind : function(){
    	if(arguments[0] === undefined)return this;
		var _args = (FWK.isArr(arguments[1]) && arguments[2]===undefined)?arguments[1]:Array.prototype.slice.call(arguments,1);
    	var method = this,obj = arguments[0];
    	return function(){
      		return method.apply(obj, _args.concat([].slice.call(arguments,0)));
    	}
	},
	/**
	 * ʹ�� this ָ��ķ����е�thisָ��_obj���� ����Event��Ϊ��һ������뷽����
	 * @param {Object} _obj		����thisָ��
	 * @param {Array} _args		�������
	 */
	bindAdEvent : function(){
		var method = this,obj = arguments[0];;
		var _args = (FWK.isArr(arguments[1])&& arguments[2]===undefined)?arguments[1]:Array.prototype.slice.call(arguments,1);
    	return function(){
      		return method.apply(obj, [arguments[0] || window.event].concat(_args).concat(Array.prototype.slice.call(arguments,1)));
    	}
	},
	/**
	 * ��thisָ��ĺ����ӳ�ִ�� _sec �룬���� _args �����Ӧ�����룬���_obj���ڣ�this��Ӧ�ĺ��� �� this ָ�� _obj
	 * @param {Number} _sec		�ӳ�ִ�� _sec ��
	 * @param {Array} _args
	 * @param {Object} _obj
	 */
	delay: function(_sec, _args, _obj){
		var method = this;
		_sec = _sec * 1000;
		_obj = _obj || method;
		_args = _args || [];
		return window.setTimeout(function(){
			return method.apply(_obj, _args);
		}, _sec);
	}
});
